package com.hsqyz.common.utils.ip;

import cn.hutool.core.net.NetUtil;
import cn.hutool.http.HtmlUtil;
import com.hsqyz.common.utils.string.StringUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * 获取地址类
 *
 * @author lcz
 */
@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class AddressUtils {

    // 未知地址
    public static final String UNKNOWN = "XX XX";

    /**
     * 根据IP地址获取实际地址信息
     *
     * @param ip IP地址
     * @return 实际地址信息，如果无法获取则返回"内网IP"或"未知"
     */
    public static String getRealAddressByIP(String ip) {
        // 如果IP地址为空或空白，则返回"未知"
        if (StringUtils.isBlank(ip)) {
            return UNKNOWN;
        }

        // 将IPv6的::1转换为IPv4的127.0.0.1，同时清除HTML标签
        ip = StringUtils.contains(ip, "0:0:0:0:0:0:0:1") ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(ip);

        // 如果是内网IP，则返回"内网IP"
        try {
            if (NetUtil.isInnerIP(ip)) {
                return "内网IP";
            }
        } catch (Exception e) {
            log.error("IP地址解析异常 {}", e.getMessage());
            return "无效的IPv4地址";
        }

        // 通过IP地址获取实际地址信息
        return RegionUtils.getCityInfo(ip);
    }

}
